home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / answr202 / answer.asm next >
Assembly Source File  |  1986-12-14  |  8KB  |  170 lines

  1.  
  2. ;program:  ANSWER.COM
  3. ;syntax:   ANSWER [prompt line]
  4. ;author:   Frank Schweiger     (02/01/86)
  5. ;       v1.00           original
  6. ;history:  Brad Berson           (12/14/86)
  7. ;       disassembled using ASMGEN2 (v2.01 - J. Gersbach, J. Damke)
  8. ;          v2.00               Added uppercase conversion
  9. ;       v2.01           Added proper cr/lf after return key pressed
  10. ;       v2.02           Fixed dumb bug in uppercase conversion
  11. ;create:   MASM ANSWER;
  12. ;       LINK ANSWER;
  13. ;       EXE2BIN ANSWER.EXE ANSWER.COM
  14. ;       DEL ANSWER.OBJ
  15. ;       DEL ANSWER.EXE
  16. ;
  17. ;I commented this the best I could, but somewhat tersely, as
  18.  
  19. RET_NEAR        MACRO
  20. DB      0C3H
  21. ENDM
  22.  
  23. .RADIX  16
  24. LF      EQU     0AH
  25. CR      EQU     0DH
  26.  
  27. CODE    SEGMENT
  28.     ASSUME    DS:CODE, SS:CODE, CS:CODE, ES:CODE
  29.         ORG     $+0100H
  30.  
  31. BEGIN:  MOV     SI,80                           ;length of cmd_tail PSP to SI
  32.         LODSB                                   ;to AX, inc SI to point cmd_tail
  33.         AND     AX,7F                           ;make sure length 1..127
  34.     JZ    KBDIN                ;dont print cmd_tail if len=0
  35.         MOV     DI,AX                           ;length to DI
  36.         ADD     DI,SI                           ;add offset to length cmd_tail
  37.         MOV     BYTE PTR [DI],24                ;terminate cmd_tail with '$'
  38.         MOV     DX,SI                           ;offset cmd_tail to DX
  39.         INC     DX                              ;compensate for leading space
  40.         MOV     AH,9                            ;print_string
  41.         INT     21                              ;dos call
  42.  
  43. KBDIN:    MOV    DX,OFFSET BUF_MAX_LEN        ;1st byte of buffer is max_len
  44.         MOV     AH,0A                           ;for get_buffered_input
  45.         INT     21                              ;dos call
  46.     PUSH    DX                ;save DX
  47.     MOV    DL,CR                ;
  48.     MOV    AH,2                ;print CR
  49.         INT     21                              ;
  50.     MOV    DL,LF                ;
  51.     MOV    AH,2                ;print LF
  52.         INT     21                              ;
  53.     POP    DX                ;restore DX
  54.     MOV    AL,BUF_CON_LEN            ;check length of vbl
  55.     CMP    AL,0                ;more than 0?
  56.     JZ    DOIT                ;skip upcas if 0
  57.         CALL    UPCAS                           ;convert input to uppercase
  58.  
  59. DOIT:    CALL    FNDENV                ;find location of prnt_env
  60.         MOV     CX,BX                           ;BX env_size to CX
  61.         MOV     ES,AX                           ;AX env_seg to ES
  62.         XOR     DI,DI                           ;zero DI for str_srch
  63.         XOR     AL,AL                           ;val to search for in AL 0
  64.         CLD                                     ;set DF to inc DI in str_srch
  65. SRCH:    REPNZ    SCASB                ;search entire prnt_env
  66.     JNZ    ERR                ;ERR if 0 not found
  67.         CMP     AL,ES:[DI]                      ;followed by another 0 (end)?
  68.     JZ    DOENV                ;yes, go modify env, else
  69.         MOV     DX,DI                           ;save pntr from str_srch in DX
  70.         MOV     BP,CX                           ;save cntr from str_srch in BP
  71.         MOV     SI,OFFSET ENV_STRING            ;looking for 'ANSWER='
  72.         MOV     CX,7                            ;length of 'ANSWER=' to CX
  73.         REPZ    CMPSB                           ;compare with env
  74.     JZ    CHK                ;jump if compare successful
  75.         MOV     DI,DX                           ;restore pntr fr str_srch to DI
  76.         MOV     CX,BP                           ;restore cntr fr str_srch to CX
  77.     JMP    SHORT    SRCH            ;search for next 0
  78.  
  79. CHK:    MOV    CX,51                ;max len of ANSWER vbl to CX
  80.         REPNZ   SCASB                           ;search for and of vbl 0
  81.     JNZ    ERR                ;ERR if 0 not found in 51H tries
  82.         MOV     SI,DI                           ;offset end_of_answr +1 to SI
  83.         MOV     DI,DX                           ;offset ANSWER in prnt_env to DI
  84.         MOV     CX,ES                           ;copy ES
  85.         MOV     DS,CX                           ;  to DS
  86.         MOV     CX,BX                           ;length prnt_env to CX
  87.         SUB     CX,SI                           ;CX= length-offset end_of_answr
  88. DUN_1:    LODSB                    ;byte at end_of_answr + 1 to DI,
  89.         AND     AL,AL                           ;inc SI.
  90.     JZ    DOENV                ;jump if 0 (end_of_env)
  91. DUN_2:    STOSB                    ;byte at end_of_answr + 1 to
  92.     LOOP    DUN_3                ;offset of ANSWER=, inc SI,
  93.     JMP    SHORT    ERR            ; get next byte in environment
  94. DUN_3:    LODSB                    ;get next byte in environment
  95.         AND     AL,AL                           ;is it 0 (end_of_vbl)?
  96.     JNZ    DUN_2                ;move byte and get next, else
  97.     STOSB                    ;move this byte and check if
  98.     LOOP    DUN_1                ;end_of_env
  99.  
  100. ERR:    MOV    AX,4C01             ;exit with errorlevel 1
  101.         INT     21                              ;dos call
  102.  
  103. DOENV:    MOV    BYTE PTR ES:[DI],0        ;
  104.         MOV     AX,CS                           ;move CS
  105.         MOV     DS,AX                           ;  to DS
  106.         MOV     AL,BUF_CON_LEN                  ;buf_con_len to AL (len of vbl)
  107.         XOR     AH,AH                           ;zero AH for these additions...
  108.         ADD     AX,8                            ; length of 'ANSWER='
  109.         ADD     AX,DI                           ; offset of end_of_answr
  110.         CMP     AX,BX                           ;len prnt_env - tot calc length
  111.     JNB    ERR                ;jump if calc gt actual (JA)
  112.         MOV     SI,OFFSET ENV_STRING            ;offset of 'ANSWER=' to SI
  113.         MOV     CX,7                            ;length of 'ANSWER='
  114.         REPZ    MOVSB                           ;move 'ANSWER=' to env_tail
  115.         MOV     SI,OFFSET KBD_BUFFER            ;offset of vbl to SI
  116.         MOV     CL,BUF_CON_LEN                  ;length of buffer to CX
  117.         REPZ    MOVSB                           ;move vbl to end after '='
  118.         XOR     AX,AX                           ;word 00 in AX
  119.         STOSW                                   ;move word 00 to end_of_vbl
  120.         MOV     AX,4C00                         ;exit with errorlevel 0
  121.         INT     21                              ;dos call
  122.  
  123. FNDENV: PUSH    ES                ;save ES
  124.         MOV     AX,CS                           ;move CS
  125.         MOV     ES,AX                           ;  to ES (point ES to psp)
  126.         MOV     AX,ES:14                        ;psp:14 pntr prnt_psp seg to AX
  127.         MOV     ES,AX                           ;prnt_psp seg to ES
  128.         MOV     AX,ES:2C                        ;prnt_psp:2c pntr prnt_env seg
  129.         AND     AX,AX                           ;unless prnt_env seg is 00
  130.     JNZ    FNDSIZ                ;jump (should always jump)
  131.         MOV     AX,ES                           ;
  132.     DEC    AX                ;     /         ?
  133.     MOV    ES,AX                ;        /
  134.     ADD    AX,ES:3             ;          /
  135.     ADD    AX,2                ;     ?         /
  136. FNDSIZ: DEC    AX                ;point ES to prnt_mcb
  137.         MOV     ES,AX                           ; (para below prnt_env)
  138.         INC     AX                              ;reset AX
  139.         MOV     BX,ES:3                         ;env_size at mcb:3 to BX
  140.         SHL     BX,1                            ;convert BX from
  141.         SHL     BX,1                            ;# paragraphs
  142.         SHL     BX,1                            ;to
  143.         SHL     BX,1                            ;# bytes
  144.         POP     ES                              ;restore ES
  145.         RET_NEAR                                ;return
  146.  
  147. UPCAS:    XOR    CX,CX
  148.         MOV     CL,BUF_CON_LEN                  ;length vbl to convert in CX
  149.         MOV     BX,OFFSET KBD_BUFFER            ;beginning of vbl
  150. TSTCH:    MOV    AL,[BX]             ;character to BX
  151.         CMP     AL,'a'                          ;below lower case char?
  152.     JB    NXTCH                ;skip if so
  153.         CMP     AL,'z'                          ;above lower case char?
  154.     JA    NXTCH                ;skip if so
  155.         AND     AL,5F                           ;mask out bit 5
  156. NXTCH:    MOV    [BX],AL             ;store the character
  157.         INC     BX                              ;point to next char
  158.     LOOP    TSTCH                ;do until no more chars
  159.         RET_NEAR                                ;return
  160.  
  161. BUF_MAX_LEN    DB    50
  162. BUF_CON_LEN    DB    0
  163. KBD_BUFFER    DB    50 DUP(0)
  164. ENV_STRING    DB    'ANSWER=VER 2.02'
  165.  
  166.     CODE    ENDS
  167.  
  168. END     BEGIN
  169.  
  170.